package org.tools.wstt.utils.logger;

import java.io.IOException;
import java.io.Serializable;
import java.net.URL;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
import org.apache.log4j.Priority;
import org.apache.log4j.xml.DOMConfigurator;

public class WsttLoggerImpl implements IWsttLogger, Serializable {

	private static final long serialVersionUID = 1L;

	private static final String PROPERTY_FILE = "logger-config.xml";

	private transient Logger mLogger = null;

	private String mClassnameForLogger = "";

	static {
		init();
	}

	/**
     * 
     */
	private static void init() {
		try {
			URL propertyFileURL = WsttLoggerImpl.class.getClassLoader()
					.getResource(PROPERTY_FILE);
			DOMConfigurator.configure(propertyFileURL);
			Logger loggerLocal = Logger.getLogger(WsttLoggerImpl.class);
			loggerLocal.debug(propertyFileURL.getPath());
		} catch (Exception e) {
			BasicConfigurator.configure();
			Logger loggerLocal = Logger.getLogger(WsttLoggerImpl.class);
			loggerLocal.fatal(
					"Impossible de charger le fichier de configuration Log4J : "
							+ PROPERTY_FILE, e);
		}
	}

	/**
	 * 
	 * @param pClass
	 */
	public WsttLoggerImpl(Class pClass) {
		super();
		mLogger = Logger.getLogger(pClass);
		mClassnameForLogger = pClass.getName();
	}

	/**
	 * 
	 * @param pClassName
	 */
	public WsttLoggerImpl(String pClassName) {
		super();
		mLogger = Logger.getLogger(pClassName);
		mClassnameForLogger = pClassName;
	}

	/**
	 * Deserialization method
	 * 
	 * @param in
	 * @throws IOException
	 * @throws ClassNotFoundException
	 */
	private void readObject(java.io.ObjectInputStream in) throws IOException,
			ClassNotFoundException {
		in.defaultReadObject();
		mLogger = Logger.getLogger(mClassnameForLogger);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#debug(java.lang.Object)
	 */
	public void debug(Object arg0) {
		mLogger.debug(arg0);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#debug(java.lang.Object,
	 * java.lang.Throwable)
	 */
	public void debug(Object arg0, Throwable arg1) {
		mLogger.debug(arg0, arg1);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#error(java.lang.Object)
	 */
	public void error(Object arg0) {
		mLogger.error(arg0);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#error(java.lang.Object,
	 * java.lang.Throwable)
	 */
	public void error(Object arg0, Throwable arg1) {
		mLogger.error(arg0, arg1);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#fatal(java.lang.Object)
	 */
	public void fatal(Object arg0) {
		mLogger.fatal(arg0);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#fatal(java.lang.Object,
	 * java.lang.Throwable)
	 */
	public void fatal(Object arg0, Throwable arg1) {
		mLogger.fatal(arg0, arg1);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#info(java.lang.Object)
	 */
	public void info(Object arg0) {
		mLogger.info(arg0);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#info(java.lang.Object,
	 * java.lang.Throwable)
	 */
	public void info(Object arg0, Throwable arg1) {
		mLogger.info(arg0, arg1);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#warn(java.lang.Object)
	 */
	public void warn(Object arg0) {
		mLogger.warn(arg0);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#warn(java.lang.Object,
	 * java.lang.Throwable)
	 */
	public void warn(Object arg0, Throwable arg1) {
		mLogger.warn(arg0, arg1);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#isDebugEnabled()
	 */
	public boolean isDebugEnabled() {
		return mLogger.isDebugEnabled();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#isErrorEnabled()
	 */
	public boolean isErrorEnabled() {
		return mLogger.isEnabledFor(Priority.ERROR);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#isFatalEnabled()
	 */
	public boolean isFatalEnabled() {
		return mLogger.isEnabledFor(Priority.FATAL);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#isInfoEnabled()
	 */
	public boolean isInfoEnabled() {
		return mLogger.isInfoEnabled();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#isWarnEnabled()
	 */
	public boolean isWarnEnabled() {
		return mLogger.isEnabledFor(Priority.WARN);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#entree(java.lang.String)
	 */
	public void entree(String nomMethode) {
		if (isDebugEnabled()) {
			mLogger.debug("Entree dans la methode " + nomMethode);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#entree(java.lang.String,
	 * java.lang.String)
	 */
	public void entree(String nomMethode, String parametres) {
		if (isDebugEnabled()) {
			mLogger.debug("Entree dans la methode " + nomMethode
					+ " avec les parametres: " + parametres);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#sortie(java.lang.String)
	 */
	public void sortie(String nomMethode) {
		if (isDebugEnabled()) {
			mLogger.debug("Sortie de la methode " + nomMethode);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#sortie(java.lang.String,
	 * java.lang.String)
	 */
	public void sortie(String nomMethode, String retourMethode) {
		if (isDebugEnabled()) {
			mLogger.debug("Sortie de la methode " + nomMethode
					+ " avec le retour: " + retourMethode);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#entree(java.lang.String)
	 */
	public void entreeError(String nomMethode) {
		if (isErrorEnabled()) {
			mLogger.error("Entree dans la methode " + nomMethode);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#entree(java.lang.String)
	 */
	public void entreeError(String nomMethode, String parametres) {
		if (isErrorEnabled()) {
			mLogger.error("Entree dans la methode " + nomMethode
					+ " avec les parametres: " + parametres);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#sortie(java.lang.String)
	 */
	public void sortieError(String nomMethode, String retourMethode) {
		if (isErrorEnabled()) {
			mLogger.error("Sortie de la methode " + nomMethode
					+ " avec le retour: " + retourMethode);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tools.wstt.utils.logger.WsttLogger#sortie(java.lang.String)
	 */
	public void sortieError(String nomMethode) {
		if (isErrorEnabled()) {
			mLogger.error("Sortie de la methode " + nomMethode);
		}
	}
}